//request .ts 文件
// 引入axios请求库
import axios from 'axios'
import Token from './token.ts'
import { ElMessage } from "element-plus";
// 默认超时时间
axios.defaults.timeout = 30000
axios.defaults.baseURL = import.meta.env.VITE_APP_BASE_URL // 基础路径
axios.defaults.headers.post['Content-Type'] = 'application/json'

// axios请求拦截器
// 添加请求拦截器
axios.interceptors.request.use(
  function (config: any) {
    // 在发送请求之前做些什么
    return config
  },
  function (error: any) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// axios响应拦截器
axios.interceptors.response.use(
  (response: any) => {
    return response
  },
  (error: any) => {
    console.log('error', error)
    // 处理异常情况，根据项目实际情况处理或不处理
    if (error && error.response) {
      // 根据约定的响应码处理
      switch (error.response.status) {
        case 403:
          ElMessage.error('拒绝访问')
          break
        case 502:
          ElMessage.error('服务器端出错')
          break
        case 401:
          ElMessage.error('token已过期，请重新登录')
          // 跳转到登录页
          Token.removeToken()
          break
        default:
          ElMessage.error(`连接错误${error.response.status}`)
      }
    } else {
      // 超时处理
      ElMessage.error( `服务器响应超时`)
    }
    return Promise.resolve(error.response)
  }
)

interface ConfigType {
  method: string
  url: string
  params?: any
  data?: any
  headers?: any
  configs?: any // 更多的配置
  successTip?: boolean
  errorTip?: boolean
  timeout?: number
  [key: string]: any
}

const request = async ({
  method = 'get',
  url = '',
  params = {},
  data = {},
  headers = {},
  configs = {}, // 更多的配置
  successTip = false,
  errorTip = true,
  timeout = 10000
}: ConfigType) => {
  // 查看是否在cookie里面
  const access_token = Token.getToken()
  // 在,说明已经存入,放入headers中
  if (access_token) {
    headers.Authorization = `bearer ${access_token}`
  }
  const Config: ConfigType = {
    method,
    url,
    params,
    data,
    headers,
    configs, // 更多的配置
    successTip,
    errorTip,
    timeout
  }

  return new Promise((resolve, reject) => {
    axios(Config)
      .then((response: any) => {
        // 下载处理
        if (typeof configs.responseType != 'undefined' && configs.responseType == 'blob') {
          resolve(response)
        } else {
          if (typeof response == 'undefined') {
            // 请求不成功的时候执行
            reject()
          } else if (response && response.data && response.data.code != 0) {
            // 接口请求成功但code不为零时触发
            reject(response)
          } else {
            if (successTip && typeof response.data.data.message == 'string') {
             ElMessage.error( `${response.data.data.message}`)
            }

            resolve(response)
          }
        }
      })
      .catch((err: any) => {
        reject(err)
      })
  })
}

export default request
